home *** CD-ROM | disk | FTP | other *** search
/ Almathera Ten Pack 3: CDPD 3 / Almathera Ten on Ten - Disc 3: CDPD3.iso / fish / 001-100 / 001-025 / 023 / ver30 / sys / sysv / spawn.c < prev    next >
C/C++ Source or Header  |  1995-03-17  |  2KB  |  76 lines

  1. /*
  2.  * Name:    MicroEMACS
  3.  *        Spawn CLI for System V.
  4.  * Version:    0
  5.  * Last edit:    17-Apr-86
  6.  * By:        gonzo!daveb
  7.  *        {sun, amdahl, mtxinu}!rtech!daveb
  8.  *
  9.  * Spawn for System V.
  10.  */
  11. #include    "def.h"
  12.  
  13. #include    <signal.h>
  14.  
  15. char    *shellp    = NULL;            /* Saved "SHELL" program.    */
  16. char    *shname = NULL;            /* Saved shell name        */
  17.  
  18. extern    char    *getenv();
  19.  
  20. /*
  21.  * On System V, we no gots job control, so always run
  22.  * a subshell using fork/exec. Bound to "C-C", and used
  23.  * as a subcommand by "C-Z". (daveb)
  24.  *
  25.  * Returns 0 if the shell executed OK, something else if
  26.  * we couldn't start shell or it exited badly.
  27.  */
  28. spawncli(f, n, k)
  29. {
  30.     extern char    *strrchr();
  31.     register int    pid;
  32.     register int    wpid;
  33.     register int    (*oqsig)();
  34.     register int    (*oisig)();
  35.     int        status;
  36.     int        errp = FALSE;
  37.  
  38.     if (shellp == NULL) {
  39.         shellp = getenv("SHELL");
  40.         if (shellp == NULL)
  41.             shellp = getenv("shell");
  42.         if (shellp == NULL)
  43.             shellp = "/bin/sh";    /* Safer.        */
  44.         shname = strrchr( shellp, '/' ); 
  45.         shname = shname ? shname++ : shellp;
  46.         
  47.     }
  48.     ttcolor(CTEXT);
  49.     ttnowindow();
  50.     ttmove(nrow-1, 0);
  51.     if (epresf != FALSE) {
  52.         tteeol();
  53.         epresf = FALSE;
  54.     }
  55.     ttclose();
  56.     sgarbf = TRUE;                /* Force repaint.    */
  57.     oqsig = signal(SIGQUIT, SIG_IGN);
  58.     oisig = signal(SIGINT,  SIG_IGN);
  59.     if ((pid=fork()) == 0) {
  60.         execlp(shellp, shname, "-i", NULL);
  61.         _exit(1);            /* Should do better!    */
  62.     }
  63.     else if (pid > 0) {
  64.         while ((wpid=wait(&status))>=0 && wpid!=pid)
  65.             ;
  66.     }
  67.     else errp = TRUE;
  68.  
  69.     signal(SIGINT,  oisig);
  70.     ttopen();
  71.     if(errp)
  72.         eprintf("Failed to create process");
  73.  
  74.     return ( errp | status );
  75. }
  76.